📝 我的笔记

还没有笔记

选中页面文字后点击「高亮」按钮添加

并发套接字

📜 原文
📖 逐步解释
∑ 公式拆解
💡 数值示例
⚠️ 易错点
📝 总结
🎯 存在目的
🧠 直觉心智模型
💭 直观想象

1并发套接字

COMS W3157

Borowski 博士

1 客户端-服务器通信再探

哥伦比亚大学

2 关闭套接字之后

服务器关闭客户端套接字之后…

3 我们当前的设计

| 客户端 1 | 服务器 | | 客户端 2 |

| :--- | :--- | :--- | :--- |

| 调用 connect 返回 connect | | 调用 accept | 调用 connect
客户端 2 阻塞等待完成其连接请求,直到午饭后! |

| 调用 fgets | | 调用 read | |

| 用户去吃午饭 | 服务器阻塞等待客户端 1 的数据 | | |

| 客户端 1 阻塞等待用户输入数据 | | | |

| 如 D. Murray, R. Bryant, and G. Langale 15-441/213 幻灯片所示 | | | |

4 更好的并发设计

摘自 D. Murray, R. Bryant, and G. Langale 15-441/213 幻灯片

5 并发选择

线程

使用 select()

6 什么是 select()?

监视文件描述符,直到达到 FD_SETSIZE (1024) 的数字

注意:对于许多现代应用程序来说,这是一个“不合理”的低限制,而且这个限制不会改变。但是,它对于本课程中的应用程序来说是完全可以接受的!如果你需要更高的限制,请考虑使用 poll ( )。

它是如何工作的?

7 select() 的使用

```c

int select(int nfds,

fd_set *readfds,

fd_set *writefds,

fd_set *exceptfds,

const struct timespec *timeout);

```

8 有用的宏

```c

void FD_ZERO(fd_set *fdset);

clear out all bits

void FD_SET(int fd, fd_set *fdset);

set one bit

void FD_CLR(int fd, fd_set *fdset);

clear one bit

int FD_ISSET(int fd, fd_set *fdset);

test whether fd bit is set

```